package com.tech.mapper;

import com.tech.repository.dto.GoodsInfo;
import com.tech.repository.entity.Goods;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.TreeMap;

public interface GoodsDao {
	/**
	 * 通过ID查找商品
	 *
	 * @param gid 要查找商品的所属ID
	 * @return 找到就返回，否则返回null
	 */
	@Select("select * from goodsinfo where gid = #{gid};")
	Goods getGoodsByGid(@Param("gid") int gid);

	/**
	 * 获取指定用户的所有商品
	 *
	 * @return 该用户的商品列表
	 */
	List<Goods> getUserGoods(int userId);

	/**
	 * 获取商品种类数量
	 *
	 * @return 获取商品种类数量
	 */
	int getGoodsCount();

	/**
	 * 从指定索引开始获取指定数量的商品数据
	 *
	 * @param beginIndex 指定索引，第一个商品商品索引为 0
	 * @param count      商品数量，如果不够就会小于 count
	 * @param order      排序的描述符，如果不需要排序就填null，例如按人气排序 "gpopularity desc"
	 * @return 查询到的商品列表
	 */
	List<Goods> getGoodsList(@Param("beginIndex") int beginIndex, @Param("count") int count, @Param("order") String order);

	GoodsInfo getGoodsInfo(int goodsId);

	/**
	 * 获取商品编号递增的所有商品
	 *
	 * @return 所有商品信息，键为用户ID，值为商品列表
	 */
	TreeMap<Integer, List<Goods>> getAllGoods();

	/**
	 * 添加新的商品信息
	 *
	 * @param goods 新的商品信息
	 * @return 新商品所属ID
	 */
	@Insert("""
				insert into goodsinfo(gid, gname, gpopularity, gintroduce, 
				gprice, gsecprice, gcondition, uid, uname, gcount, gsendmode, gcreatetime) 
				VALUES (null, #{gname}, #{gpopularity}, #{gintroduce}, 
				#{gprice}, #{gsecprice}, #{gcondition}, #{uid}, #{uname}, #{gcount}, #{gsendmode}, #{gcreatetime});
			""")
	@Options(useGeneratedKeys = true, keyProperty = "gid", keyColumn = "gid")
	int addGoods(Goods goods);

	/**
	 * 添加新的商品信息
	 *
	 * @param goodsList 商品列表
	 * @return 影响的行数
	 */
	int[] addGoodsList(List<Goods> goodsList);

	/**
	 * 根据ID删除指定商品
	 *
	 * @param gid 要删除商品的ID
	 * @return 是否删除成功，不存在时返回false
	 */
	@Delete("delete from goodsinfo where gid = #{gid};")
	boolean delGoods(@Param("gid") int gid);

	/**
	 * 根据ID批量删除商品
	 *
	 * @param goodsList 要删除商品的ID列表
	 * @return 影响到的行数
	 */
	int[] delGoods(List<Integer> goodsList);

	/**
	 * 删除指定用户的所有商品
	 *
	 * @param userId 用户ID
	 * @return 影响到的行数
	 */
	int delUserGoods(int userId);

	/**
	 * 删除所有商品
	 *
	 * @return 如果商品数据改变就返回true
	 */
	boolean delAllGoods();

	/**
	 * 修改商品信息
	 *
	 * @param editedGoods 修改后的商品
	 * @return 是否保存成功
	 */
	boolean updateGoods(Goods editedGoods);
}
